#include "ManejadorArchivos.h"
#include "Parser.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

/* ******************************************************************
 *                        PRUEBAS UNITARIAS							*
 * *****************************************************************/
 
void print_test(char* name, bool result) {
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}

/* Prueba que las primitivas del vector funcionen correctamente. */
void prueba_ManejadorArchivos() {
    
	char* nombre = malloc (12*sizeof(char));
	strcpy (nombre, "Archivo.txt");
	char* linea;
	char* fragmento;
	int numero = 1;
	int offset = 0;
	int ultimaPalabra = 0;
	
	Parser_t* parser;
   
	ManejadorArchivos_t*  archivo=ManejadorArchivos_crear(nombre);
   
	while(!ManejadorArchivos_terminoDeLeer(archivo)) {
		linea = ManejadorArchivos_leer(archivo);
		parser = Parser_crear(linea, numero, offset, ultimaPalabra);
		while(!Parser_TerminoDeParsear(parser)) {
			fragmento = Parser_parsear(parser);
			offset = Parser_offset(parser);
			ultimaPalabra = Parser_numeroDePalabra(parser);
			printf("%s,%d,%d ",fragmento, offset, ultimaPalabra);
			free(fragmento);
		}
		offset = Parser_posicionEnArchivo(parser);
		Parser_destruir(parser);
		free(linea);
	}
	print_test("\nPruebo que el manejadorArchivos Termino De Leer ",ManejadorArchivos_terminoDeLeer(archivo));
	
	ManejadorArchivos_destruir(archivo);

}


/* Prueba que las primitivas del vector funcionen correctamente. Con un archivo mas extenso */
void pruebaDos_ManejadorArchivosParseador() {
    
	char* nombre = malloc (13*sizeof(char));
	strcpy (nombre, "Archivo2.txt");
	char* linea;
	char* fragmento;
	int numero = 1;
	int offset = 0;
	int ultimaPalabra = 0;
	
	Parser_t* parser;
   
	ManejadorArchivos_t*  archivo=ManejadorArchivos_crear(nombre);
   
	while(!ManejadorArchivos_terminoDeLeer(archivo)) {
		linea = ManejadorArchivos_leer(archivo);
		parser = Parser_crear(linea, numero, offset, ultimaPalabra);
		while(!Parser_TerminoDeParsear(parser)) {
			fragmento = Parser_parsear(parser);
			
			offset = Parser_offset(parser);
			ultimaPalabra = Parser_numeroDePalabra(parser);
			// Se agrega el siguiente if, porque el parser devuelve strings vacios para los strings que son solo símbolos durante toda la linea.
			if(strlen(fragmento) != 0) {
			printf("%s,%d,%d ",fragmento, offset, ultimaPalabra);
			}
			free(fragmento);
		}
		offset = Parser_posicionEnArchivo(parser);
		Parser_destruir(parser);
		free(linea);
	}
	print_test("\nPruebo que el manejadorArchivos Termino De Leer ",ManejadorArchivos_terminoDeLeer(archivo));
	
	ManejadorArchivos_destruir(archivo);

}


/* ******************************************************************
 *                        PROGRAMA PRINCIPAL
 * *****************************************************************/

/* Programa principal. */
int main(void) {

	printf ("\nCOMIENZO DE PRUEBAS DE PARSER Y MANEJADOR ARCHIVOS.\n\n");
	
    prueba_ManejadorArchivos();
        
	printf ("\nFIN DE PRUEBAS DE PARSER Y MANEJADOR ARCHIVOS.\n\n");
	
	printf ("\nCOMIENZO DE LA PRUEBA 2 DE PARSER Y MANEJADOR ARCHIVOS.\n\n");
	
	pruebaDos_ManejadorArchivosParseador();
	
	printf ("\nFIN DE PRUEBAS DE PARSER Y MANEJADOR ARCHIVOS.\n\n");
	
    return 0;
}

